type ICallback = (progress: number) => void;

/**
 * 封装动画函数
 * @param duration 动画持续时间
 * @param from 动画起始值
 * @param to 动画结束值
 * @param callback 回调函数，将变化的值通过回调函数返回
 */
export function animate(
  duration: number,
  from: number,
  to: number,
  callback: ICallback
) {
  // 计算动画的差值
  const dis = to - from;
  // 计算动画的速度
  const speed = dis / duration;
  // 获取动画开始的时间
  const start = Date.now();
  // 初始化动画的值
  let val = from;
  // 如果有回调函数，则执行回调函数
  callback && callback(val);
  // 定义一个名为_run的函数，用于执行动画
  function _run() {
    // 获取当前时间
    const now = Date.now();
    // 计算动画的进度
    const progress = now - start;
    // 如果动画已经完成，则执行回调函数，并返回
    if (progress >= duration) {
      val = to;
      callback && callback(val);
      return;
    }
    // 计算动画的差值
    const d = progress * speed;
    // 更新动画的值
    val = from + d;
    // 如果有回调函数，则执行回调函数
    callback && callback(val);
    // 请求下一帧动画
    requestAnimationFrame(_run);
  }
  // 执行动画
  _run();
}
